package com.sunday.common.sharding.sphere.jdbc.study.base.sync.obj;

import java.util.Date;
import java.util.concurrent.TimeUnit;

/**
 * @Description: synchronized对象锁
 * <p>
 * 这里说的synchronized对象锁的作用范围是对象级别的即仅仅作用于同一个对象，如果是同一个类的两个不同的对象是不会互斥的，即没有效果的。
 * @Author: zsy
 * @Create: 2023/4/4 15:09
 */
public class SynchronizeAndObjectLock {

    /**
     * synchronized修饰同一个类对象的两个非静态方法时互斥
     * <p>
     * 【结论】两个线程同时执行被synchronized修饰的相同对象的不同（相同）方法，锁生效，因为两个线程使用的是相同的对象锁
     */
    public static void main(String[] args) throws Exception {
        // 【注意】当且仅当是同一个SynchronizeAndObjectLock对象
        SynchronizeAndObjectLock synchronizeAndObjectLock = new SynchronizeAndObjectLock();
        new Thread(() -> {
            synchronizeAndObjectLock.test1();
        }).start();

        new Thread(() -> {
            synchronizeAndObjectLock.test2();
        }).start();
    }

    public synchronized void test1() {
        System.out.println(new Date() + " " + Thread.currentThread().getName() + " begin...");
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (Exception e) {
        }
        System.out.println(new Date() + " " + Thread.currentThread().getName() + " end...");
    }

    public synchronized void test2() {
        System.out.println(new Date() + " " + Thread.currentThread().getName() + " begin...");
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (Exception e) {
        }
        System.out.println(new Date() + " " + Thread.currentThread().getName() + " end...");
    }

}
